package services

import (
	"errors"
	"time"
	"yuanaiproblem/dao"
	models "yuanaiproblem/dao/model"
	"yuanaiproblem/utils"

	"golang.org/x/crypto/bcrypt"
)

// AuthenticateUser 验证用户登录信息
// 入参：用户名、密码；返回：用户信息或错误
// 流程：查询用户 -> 验证密码 -> 返回结果
func AuthenticateUser(username, password string) (*models.User, error) {
	// 调用dao层通过用户名查询用户
	user, err := dao.GetUserByUsername(username)
	if err != nil {
		// 统一处理查询错误（如用户不存在等）
		return utils.HandleUserQueryError(err)
	}
	// 比对密码哈希与输入密码
	if err := bcrypt.CompareHashAndPassword(
		[]byte(user.PasswordHash),
		[]byte(password),
	); err != nil {
		return nil, errors.New("密码错误")
	}
	return user, nil
}

// Register 注册新用户
// 入参：用户名、密码；返回：创建的用户信息或错误
// 流程：验证参数 -> 检查用户名唯一性 -> 加密密码 -> 创建用户
func Register(username, password string) (*models.User, error) {
	// 验证用户名和密码格式合法性
	if err := utils.ValidateUserCredentials(username, password); err != nil {
		return nil, err
	}
	// 检查用户名是否已存在
	exists, err := dao.IsUsernameExists(username)
	if err != nil {
		return nil, err
	} else if exists {
		return nil, errors.New("用户名已存在")
	}
	// 密码加密处理
	hashedPassword, err := bcrypt.GenerateFromPassword(
		[]byte(password),
		bcrypt.DefaultCost, // 使用默认加密强度
	)
	if err != nil {
		return nil, errors.New("密码加密失败")
	}
	// 构造用户实体
	user := &models.User{
		Username:     username,
		PasswordHash: string(hashedPassword),
		Role:         "user", // 默认普通用户角色
		CreatedAt:    time.Now(),
		UpdatedAt:    time.Now(),
	}
	// 调用dao层创建用户
	if err := dao.CreateUser(user); err != nil {
		return nil, errors.New("创建用户失败: " + err.Error())
	}
	return user, nil
}
